package com.aivin.mobileApi;

import com.aivin.entity.*;
import com.aivin.service.PicService;
import com.aivin.service.UserService;
import com.aivin.txSms.SmsSender;
import com.aivin.utils.MyStringUtils;
import com.aivin.utils.MyTimeUtils;
import com.aivin.utils.MyValidateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取短信验证码 、验证
 */
@Controller//@Service @Component
@RequestMapping("/smsApi")
public class SMSController {

    /**短信验证码的相关配置。使用腾讯云的接口。
     * 地址为https://console.qcloud.com/sms/smslist
     * **/
    public static final int AppID= 1400017189 ;
    public static final String AppKey="db88e41d015b31f67156d32e8cda65ee";
    /**验证码有效期*/
    public final int ValidTime = 5 ;

    @Autowired
    private PicService picService  ;
    @Autowired UserService userService ;





    /***
     *根据用户的id和电话号码发送验证码  。
     *发送验证码。
     http://192.168.0.119:8081/findYou/smsApi/getSmsCodeByUserId/3/13650904957
     * @param userId  用户id
     * @param userPhone 用户的电话号码
     * @return
     */
    @RequestMapping(value = "/getSmsCodeByUserId/{userId}/{userPhone}",
            method = {RequestMethod.GET},
            produces = "text/html;charset=UTF-8")
    @ResponseBody
    public  String  getSmsCodeByUserId(   @PathVariable int userId ,@PathVariable String userPhone   ) {
        System.out.println(">>>>>>>  "+userPhone+"  "+userId);
        String jsonStr ="noData";
        int code= MyStringUtils.getRadomInt( 400000,999999) ;

        String resultStr = sendSmsCodeToUser(userPhone  ,code,ValidTime);// 验证码  五分钟有效
//        String resultStr ="123" ;

        if(resultStr.contains("服务器异常")){
            return  "服务器异常" ;
        }


        JSONObject jsonObj = JSON.parseObject(resultStr);
        String errmsg =jsonObj.getString("errmsg") ;
//        String errmsg = "OK" ;
        if("OK".equals(errmsg)){
            jsonStr="验证码已经下发" ;
            //保存验证码
           int updateResult= updataVtCodeAndTime(userId ,String.valueOf(code) ,String.valueOf(System.currentTimeMillis()));
            System.out.println("验证码更新到数据库 updateResult= "+updateResult);
        }else{
            jsonStr =errmsg ;
        }
        System.out.println("#######  "+errmsg);


        return jsonStr;
    }


    /****
     * 发送验证码
     */
    public   String sendSmsCodeToUser( String userPhone  ,int code ,int time){
        // 开放者实际发送短信时请使用申请的 sdkappid 和 appkey
        SmsSender sender = new SmsSender(AppID, AppKey);
        String msgToUser ="【嘟蜜】您的验证码是{code}，请于{time}分钟内填写。如非本人操作，请忽略本短信。" ;
        msgToUser=   msgToUser.replace("{code}" ,String.valueOf(code)).replace("{time}" , String.valueOf(time)) ;
        System.out.println(">>>>>>>  "+userPhone+"  "+msgToUser);
       return  sender.sendMsg("86",userPhone, msgToUser);

    }




    /**存储验证码 + 申请时间**/
    public  int  updataVtCodeAndTime(int  userId ,String vtCode ,String reqTime ){

        int updateState =userService.updataVtCodeAndTime(userId,vtCode,reqTime);

        return  updateState ;

    }



    /***
     * 验证码校验
     * 比较下发的验证码和用户上传输入的验证码。 校验是否可以通过手机验证。
     http://192.168.0.119:8081/findYou/smsApi/checkSmsCodeByUserId/3/456789
     * @param userId  用户id
     * @param vtCode  用户收到的验证码 < 我设定为 [400000,999999] 之间的一个随机数>
     * @return   验证情况。 根据不同的情况返回不同的值。
     *
     *   jsonStr="验证码不一致" ;  //
     *   jsonStr="success"   //验证通过
     *   jsonStr="验证码已经失效<有效期为5分钟>。请重新获取验证码。"
     *   jsonStr ="服务器校验异常"  //服务器发生错误。
     */
    @RequestMapping(value = "/checkSmsCodeByUserId/{userId}/{vtCode}",
            method = {RequestMethod.GET},
            produces = "text/html;charset=UTF-8")
    @ResponseBody

    public  String  checkSmsCodeByUserId(   @PathVariable int userId ,@PathVariable String vtCode   ) {
        //System.out.println(">>>>>>>  "+vtCode+"  "+userId);
        String jsonStr ="noData";
        TbUserV1 bean =  getUserVtCodeByUserInfo(userId) ;
        if(MyValidateUtil.isEmpty(bean)){
            jsonStr ="服务器校验异常" ;
            return  jsonStr ;
        }


        if(!bean.getVtCode().equals(vtCode)){
            jsonStr="验证码输入错误或者您还未请求验证码" ;
            return  jsonStr ;
        }
        if(!MyTimeUtils.timeIsValideInSecend(Long.parseLong(bean.getVtCodeTime()) ,System.currentTimeMillis() ,ValidTime)){
            jsonStr="验证码已经失效<有效期为5分钟>。请重新获取验证码。" ;
            return jsonStr ;
        }

        jsonStr ="success";
        System.out.println(">>>>>>>  "+vtCode+"  "+userId +"  "+bean.getVtCode());
        return jsonStr;
    }



    public TbUserV1 getUserVtCodeByUserInfo(int  userId){
        TbUserV1  bean  =   userService.getUserInfoByUserIdV1(userId) ;
        return  bean ;
    }


}
